/*例9-5 非阻塞模式的应用*/
#include <sys/types.h>
#include <sys/socket.h>
#include <error.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>  // 新增memset需要

int main(int argc, char *argv[]) {  // 修正main函数声明
    int sock;
    struct sockaddr_in my_addr;
    int async_flag = 0;
    time_t t1, t2;

    if (argc < 2) {
        printf("用法: %s <IP地址>\n", argv[0]);  // 保持原输出风格
        exit(1);
    }

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket create error!\n");
        exit(1);
    }

    memset(&my_addr, 0, sizeof(my_addr));  // 新增初始化
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(8888);

    // 修正inet_aton参数
    if (inet_aton(argv[1], (struct in_addr*)&my_addr.sin_addr) == 0) {
        printf("ip change error!\n");  // 保持原输出
        exit(1);
    }

    t1 = time(NULL);

    // 保持使用ioctl方式（原代码风格）
    ioctl(sock, FIONBIO, &async_flag);

    // 连接逻辑保持相似
    if (connect(sock, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) < 0) {
        if (errno == EINPROGRESS) {
            printf("连接正在进行中...\n");  // 修改为更合适的提示
            /* 此处可添加select/poll等待逻辑 */
        } else {
            perror("connect error!\n");
        }
    }

    t2 = time(NULL);
    printf("connect used time is %ld second\n", (long)(t2 - t1));  // 修正格式说明符

    close(sock);
    return 0;
}
